/*
  This file is part of JCM.

  JCM is free software: you can redistribute it and/or modify
  it under the terms of the GNU General Public License as published by
  the Free Software Foundation, either version 3 of the License, or
  (at your option) any later version.

  JCM is distributed in the hope that it will be useful,
  but WITHOUT ANY WARRANTY; without even the implied warranty of
  MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
  GNU General Public License for more details.

  You should have received a copy of the GNU General Public License
  along with JCM.  If not, see <http://www.gnu.org/licenses/>.
*/
import javax.swing.*;
import javax.swing.event.*;
import java.awt.*;
import java.awt.event.*;
import java.text.*;
import java.util.*;

/**
 * Diálogo modal para entrada do nome da tabela de índice de correção monetária
 * a ser criada com associação opcional a uma das séries mantidas no SGS do BCB.
*/
public class NewTableDialog extends JDialog implements ActionListener
{
  /**
   * Construtor de objetos da classe.
   *
   * @param owner Frame proprietário por onde se faz a ativação do diálogo.
   * @param list Array de strings contendo a lista de descrições das séries temporais
   *             disponíveis no SGS do BCB para associação com a tabela a ser criada.
  */
  public NewTableDialog(Frame owner, String[] list)
  {
    super(owner, "Criação de Tabela", true);

    // obtêm a métrica da fonte em uso corrente
    Font font = (Font) UIManager.getDefaults().get("Panel.font");
    FontMetrics metric = getContentPane().getFontMetrics(font);
    // comprimento da letra 'M' em pixels :: conceito do CSS
    int hGap = metric.charWidth('M');
    // distância horizontal entre componentes
    int pad = hGap / 4;
    // altura padrão de uma linha em pixels
    int vPad = metric.getHeight();

    JPanel pane = new JPanel();
    pane.setBorder(BorderFactory.createEmptyBorder(vPad, hGap, 0, hGap));
    pane.setLayout(new GridBagLayout());

    JLabel label = new JLabel("Nome:");
    label.setDisplayedMnemonic('N');
    GridBagConstraints gc = new GridBagConstraints();
    gc.anchor = GridBagConstraints.EAST;
    gc.insets.right = pad;
    pane.add(label, gc);

    nameField = new JTextField(12);
    nameField.setMinimumSize(new Dimension(nameField.getColumns()*hGap, vPad));
    nameField.setMargin(new Insets(2, 2, 2, 2));
    nameField.setToolTipText("denominação local da tabela de índices de correção monetária");
    label.setLabelFor(nameField);
    gc.anchor = GridBagConstraints.WEST;
    gc.gridwidth = GridBagConstraints.REMAINDER;
    gc.insets.right = 0;
    pane.add(nameField, gc);

    label = new JLabel("Índice:");
    label.setDisplayedMnemonic('D');
    gc.anchor = GridBagConstraints.EAST;
    gc.gridwidth = 1;
    gc.insets.right = pad;
    gc.insets.top = vPad/2;
    pane.add(label, gc);

    combo = new JComboBox(list);
    combo.insertItemAt("< Escolha opcional de uma série temporal no SGS do BCB para atualizações on line >", 0);
    combo.setSelectedIndex(0);
    combo.setToolTipText("<html>série temporal no <b>SGS do BCB</b><br>a utilizar nas atualizações on line</html>");
    label.setLabelFor(combo);
    gc.anchor = GridBagConstraints.WEST;
    gc.gridwidth = GridBagConstraints.REMAINDER;
    gc.insets.right = 0;
    pane.add(combo, gc);

    getContentPane().add(pane, BorderLayout.CENTER);

    JPanel buttonsPane = new JPanel();
    buttonsPane.setLayout(new GridLayout(1, 4, hGap, 0));
    buttonsPane.setBorder(BorderFactory.createEmptyBorder(vPad, hGap, vPad, hGap));

    // "stuff" de efeito estético inserido préviamente aos botões
    for (int i=0; i<2; i++) buttonsPane.add(Box.createHorizontalGlue());

    okBtn = new JButton("Ok");
    okBtn.setMnemonic('k');
    okBtn.addActionListener(this);
    buttonsPane.add(okBtn);

    cancelBtn = new JButton("Cancelar");
    cancelBtn.setMnemonic('C');
    cancelBtn.addActionListener(this);
    buttonsPane.add(cancelBtn);

    getContentPane().add(buttonsPane, BorderLayout.SOUTH);

    OKPressed = false;
  }

  /**
   * Cria um componente JRootPane associando a tecla Escape ao
   * encerramento da edição.
   *
   * @return Instância de componente JRootPane especializada.
  */
  @Override protected JRootPane createRootPane()
  {
    JRootPane root = new JRootPane();
    String actionName = "ESCAPE";
    Action action = new AbstractAction()
    {
      public void actionPerformed(ActionEvent ae) { setVisible(false); }
      private static final long serialVersionUID = -7727201964869006422L;
    };
    InputMap inputMap = root.getInputMap(JComponent.WHEN_IN_FOCUSED_WINDOW);
    inputMap.put(KeyStroke.getKeyStroke(actionName), actionName);
    root.getActionMap().put(actionName, action);

    return root;
  }

  /**
   * Método responsivo aos eventos gerados pelos botões.
   *
   * @param ae Evento tipo ActionEvent gerado no acionamento dos botões.
  */
  public void actionPerformed(ActionEvent ae)
  {
    OKPressed = (ae.getSource() == okBtn);
    if (OKPressed) {
      tableName = nameField.getText().trim();
      if (tableName.length() == 0) {
        String message = "<html><center>Sequência de caracteres vazia<br>ou contém somente espaços em branco.</center></html>";
        Toolkit.getDefaultToolkit().beep();
        JOptionPane.showMessageDialog(
          SwingUtilities.getWindowAncestor(nameField),
          message, "Nome Inválido", JOptionPane.ERROR_MESSAGE);
        tableName = null;
        nameField.requestFocusInWindow();
        OKPressed = false;
        return;
      }
    }
    setVisible(false);
  }

  /**
   * Retorna o status lógico do botão Ok acionado, confirmando a entrada de dados.
   *
   * @return Status lógico do botão Ok acionado.
  */
  public boolean okPressed() { return OKPressed; }

  /**
   * Retorna o nome da tabela a ser criado.
   *
   * @return Nome da tabela a ser criado.
  */
  public String getTableName() { return tableName; }

  /**
   * Retorna string contendo a descrição do índice de correção monetária selecionado.
   *
   * @return String com a descrição do índice de correção monetária selecionado.
  */
  public String getIndiceName() { return (String) combo.getSelectedItem(); }

  /** Indicador lógico de acionamento do botão Ok. */
  private boolean OKPressed;

  /** Nome da tabela a ser criado. */
  private String tableName;

  /** Componente para entrada do nome da tabela a ser criado. */
  private JTextField nameField;

  /** Componente para a seleção da descrição do índice de correção a associar. */
  private JComboBox combo;

  /** Botão de confirmação dos dados no formulário. */
  private JButton okBtn;

  /** Botão de cancelamento da entrada de dados. */
  private JButton cancelBtn;

  /** Número de identificação do objeto nas serializações. */
  private static final long serialVersionUID = 5409235976546026286L;
}
